www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/sova.m
function L_all = sova(rec_s, g, L_a, ind_dec) % 函数实现的主要功能:对解调信号进行SOVA译码,计算LLR % 输入变量: % DataInfor: 接受比特的加权. % DataInfor = 0.5 * L_c * yk = ( 2 * a * rate * Eb/N0 ) * yk % g: 生成矩阵. % prInfor: 另一个分量译码器的先验信息 % DecorderIndex: 分量译码器的索引号 % 输出变量: % LogRatio: 概率对数似然比值LogRatio=log ( P(x=1|y) ) / ( P(x=-1|y) ). % % Author: 程式小组(徐萌 张妙 张晓庆) % Date: 2010-07-11 % ========================================================== % 比特总数: 信息 + 尾比特 L_total = length(L_a); [n,K] = size(g); m = K - 1; nstates = 2^m; Infty = 1e10; %SOVA窗口大小 delta = 30; % 生成trellis [next_out, next_state, last_out, last_state] = trellis(g); % 初始化状态度量矩阵 path_metric = zeros(nstates,L_total+1); for t=1:L_total+1 for state=1:nstates path_metric(state,t) = -Infty; end end % 计算前向度量 状态度量矩阵 path_metric(1,1) = 0; for t=1:L_total y = rec_s(2*t-1:2*t); for state=1:nstates sym0 = last_out(state,1:2); sym1 = last_out(state,3:4); state0 = last_state(state,1); state1 = last_state(state,2); Mk0 = y*sym0' - L_a(t)/2 + path_metric(state0,t); Mk1 = y*sym1' + L_a(t)/2 + path_metric(state1,t); if Mk0>Mk1 path_metric(state,t+1)=Mk0; Mdiff(state,t+1) = Mk0 - Mk1; prev_bit(state, t+1) = 0; else path_metric(state,t+1)=Mk1; Mdiff(state,t+1) = Mk1 - Mk0; prev_bit(state,t+1) = 1; end end end %对于译码器1,后向路径从零状态开始;对于译码器2,后向路径从最相近状态开始 if ind_dec == 1 mlstate(L_total+1) = 1; else mlstate(L_total+1) = find( path_metric(:,L_total+1)==max(path_metric(:,L_total+1)) ); end %后向度量得到比特输入,以及最可能的路径 for t=L_total:-1:1 est(t) = prev_bit(mlstate(t+1),t+1); mlstate(t) = last_state(mlstate(t+1), est(t)+1); end %找出最小的delta for t=1:L_total llr = Infty; for i=0:delta if t+i<L_total+1 bit = 1-est(t+i); temp_state = last_state(mlstate(t+i+1), bit+1); for j=i-1:-1:0 bit = prev_bit(temp_state,t+j+1); temp_state = last_state(temp_state, bit+1); end if bit~=est(t) llr = min( llr,Mdiff(mlstate(t+i+1), t+i+1) ); end end end L_all(t) = (2*est(t) - 1) * llr; end